//
//  LPFStatusOriginalView.swift
//  WeiBo
//
//  Created by mac on 16/4/20.
//  Copyright © 2016年 mac. All rights reserved.
//

import UIKit
import SnapKit

class LPFStatusOriginalView: UIView {
    
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 记录我们原创微博的底部约束
    var originalViewBottomConstraint: Constraint?
    
    var status: LPFStatusModel?{
        didSet{
            headImageView.sd_setImageWithURL(NSURL(string: status?.user?.profile_image_url ?? ""), placeholderImage: UIImage(named: "avatar_default_big"))
            // 昵称
            nameLabel.text = status?.user?.screen_name
            
            // 会员等级
            mbrankImageView.image = getmbrankImage(status?.user?.mbrank ?? 0)
            // 时间(后期处理)
            timeLabel.text = getWeiboTimeString(status!.created_at!)
            // 来自(后期处理)
            sourceLabel.attributedText = getSourceString(status?.source)
            // 认证
            verifiedImageView.image = getverifiedImage(status?.user?.verified_type ?? -1)
            // 微博正文
            contentLabel.attributedText = getWeiboAttr(status?.text ?? "")
            
            // 给配图赋值
            
            // 先卸载掉原创微博底部约束
            self.originalViewBottomConstraint?.uninstall()
            
            /*
            是否有配图逻辑
            - status?.pic_urls.count != 0 ==  代表有配图
            - status?.pic_urls.count == 0 ==  代表没有配图
            */
            // 有配图
            if status?.pic_urls?.count != 0 && status?.pic_urls != nil{
                
                // 00- 给我们的配图赋值
                pictureView.pictureInfo = status?.pic_urls
                
                // 01-我们原创微博的底部 == 配图底部 + 10
                self.snp_makeConstraints(closure: { (make) -> Void in
                    self.originalViewBottomConstraint = make.bottom.equalTo(pictureView.snp_bottom).offset(10).constraint
                })
                
                
                // 02-显示配图(考虑到cell复用问题)
                pictureView.hidden = false
                
            }else{
                // 没有配图
                // 01-我们原创微博的底部 == 微博正文底部 + 10
                self.snp_makeConstraints(closure: { (make) -> Void in
                    self.originalViewBottomConstraint = make.bottom.equalTo(contentLabel.snp_bottom).offset(10).constraint
                })
                // 02-隐藏我们的配图(考虑到cell复用问题)
                pictureView.hidden = true
            }
        }
    }
    
    // 通过服务器返回来的int 数据 创建UIImage
    ///// 会员等级 0-6
    func getmbrankImage(mbrank: Int) -> UIImage?{
        if mbrank > 0 && mbrank < 7{
            return UIImage(named: "common_icon_membership_level\(mbrank)")
        }else{
            return UIImage(named:"common_icon_membership_expired")
        }
    }
    
    // 认证图片逻辑处理
    /// 认证类型，-1：没有认证，0，认证用户，2,3,5: 企业认证，220: 达人
    func getverifiedImage(verified: Int) -> UIImage?{
        switch verified{
        case 0:
            return UIImage(named: "avatar_vip")
        case 2,3,5:
            return UIImage(named: "avatar_enterprise_vip")
        case 220:
            return UIImage(named: "avatar_grassroot")
        default:
            return nil
        }
    }
    
    // MARK: - 设置视图
    private func setupUI(){
        self.backgroundColor = UIColor.whiteColor()
        
        addSubview(headImageView)
        addSubview(nameLabel)
        addSubview(mbrankImageView)
        addSubview(timeLabel)
        addSubview(sourceLabel)
        addSubview(verifiedImageView)
        addSubview(contentLabel)
        addSubview(pictureView)
        
        // 用户头像
        headImageView.snp_makeConstraints { (make) -> Void in
//            make.leading.equalTo(10)
//            make.top.equalTo(10)
            make.top.leading.equalTo(10)
            make.size.equalTo(CGSize(width: 35, height: 35))
        }
        // 用户昵称
        nameLabel.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(headImageView)
            make.leading.equalTo(headImageView.snp_trailing).offset(10)
        }
        // 会员等级
        mbrankImageView.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(nameLabel.snp_trailing).offset(10)
            make.centerY.equalTo(nameLabel)
        }
        // 时间
        timeLabel.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(nameLabel)
            make.bottom.equalTo(headImageView)
        }
        // 来自
        sourceLabel.snp_makeConstraints { (make) -> Void in
            make.leading.equalTo(timeLabel.snp_trailing).offset(10)
            make.bottom.equalTo(timeLabel)
        }
        // 认证
        verifiedImageView.snp_makeConstraints { (make) -> Void in
            make.centerX.equalTo(headImageView.snp_trailing)
            make.centerY.equalTo(headImageView.snp_bottom)
        }
        // 微博正文
        contentLabel.snp_makeConstraints { (make) -> Void in
            make.top.equalTo(headImageView.snp_bottom).offset(10)
            make.leading.equalTo(headImageView)
            make.width.equalTo(SCREENW - 20)
        }
        // 微博配图
        pictureView.snp_makeConstraints { (make) -> Void in
            
            make.top.equalTo(contentLabel.snp_bottom).offset(10)
            make.leading.equalTo(contentLabel)

        }
        
        // 给我们原创微博设置约束
        self.snp_makeConstraints { (make) -> Void in
            self.originalViewBottomConstraint = make.bottom.equalTo(pictureView).offset(10).constraint
        }
    }
    
    // MARK: - 懒加载控件
    // 用户头像
    private lazy var headImageView:UIImageView = UIImageView(image: UIImage(named: "avatar_default_big"))
    // 用户昵称
    private lazy var nameLabel:UILabel = UILabel(textColor: UIColor.darkGrayColor(), textFont: 14)
    // 会员等级
    private lazy var mbrankImageView: UIImageView = UIImageView(image: UIImage(named: "common_icon_membership"))
    // 时间
    private lazy var timeLabel: UILabel = UILabel(textColor: ThemeColor, textFont: 10)
    // 来自
    private lazy var sourceLabel: UILabel = UILabel(textColor: ThemeColor, textFont: 10)
    // 认证
    private lazy var verifiedImageView: UIImageView = UIImageView(image: UIImage(named: "avatar_vgirl"))
    // 微博正文
    private lazy var contentLabel: UILabel = {
        let label = UILabel(textColor: UIColor.blackColor(), textFont: 14)
        label.numberOfLines = 0
        return label
    }()
    
    // 微博配图
    private lazy var pictureView: LPFStatusPictureView = LPFStatusPictureView()
    
    
    // MARK: - 时间
    func getWeiboTimeString(weiboTime: String) -> String{
        let df = NSDateFormatter()
        // 设置格式
        // Fri Apr 22 17:15:54 +0800 2016
        df.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
        // 设置locale(需要程序员设置 如果不设置的话 可能在真机时间不对)
        df.locale = NSLocale(localeIdentifier: "en_US")
        
        // 获得微博date
        let weiboDate = df.dateFromString(weiboTime)!
        
//        print(weiboDate)
        let isThisYear = weiboTimeIsThisYear(weiboDate)
        // 代表是今年
        if isThisYear{
            
            //日历类
            let calendar = NSCalendar.currentCalendar()
            
            if calendar.isDateInToday(weiboDate){
                //如果是今天
                
                // 计算当前的日期 和微博日期的差值
                let s = NSDate().timeIntervalSinceDate(weiboDate)
                
                if s < 60{
                    //- 如果 < 60 s  显示格式: 刚刚
                    return "刚刚"
                }else if s >= 60 && s < 3600{
                    //- 如果 >=60 && < 60 * 60  显示格式: xx分钟前
                    return "\(Int(s / 60))分钟前"
                }else{
                    //- 其他 显示格式: xx小时前
                    return "\(Int(s / 3600))小时前"
                }
                
            }else if calendar.isDateInYesterday(weiboDate){
                //  如果是昨天
                df.dateFormat = "昨天 HH:mm"
                return df.stringFromDate(weiboDate)
            }else{
                //  其他
                df.dateFormat = "MM月dd日 HH:mm"
                return df.stringFromDate(weiboDate)
            }
            
        }else{
            // 代表不是今年
            // 2015年01月01日 18:18
            df.dateFormat = "yyyy年MM月dd日 HH:mm"
            return df.stringFromDate(weiboDate)
            
        }
    }
    
    // 判断是否是今年
    func weiboTimeIsThisYear(weibodate: NSDate) -> Bool{
        let df = NSDateFormatter()
        // 设置格式
        df.dateFormat = "yyyy"
        
        df.locale = NSLocale(localeIdentifier: "en_US")
        
        //得到微博时间年的字符串
        let weiboStr = df.stringFromDate(weibodate)
        
        //当前年字符串
        let currentStr = df.stringFromDate(NSDate())
        
        // 如果微博的年的字符串和当前时间年的字符串一样 就代表是今年
        if weiboStr == currentStr{
            return true
        }else{
             return false
        }

    }
    
    
    // MARK: -  处理微博来源字符串
    func getSourceString(source: String?) -> NSMutableAttributedString{
        // 判断我们的来源字符串是否存在 且包含'\">'符号
        guard let s = source where s.containsString("\">") else{
            return NSMutableAttributedString(string: "")
        }
        
        let startRange = s.rangeOfString("\">")!
        let endRange = s.rangeOfString("</a")!
        
        
        let result = s.substringWithRange(startRange.endIndex..<endRange.startIndex)
        // 拼接后最终显示的结果
        let name = "来自 \(result)"
        // 通过富文本
        let attr = NSMutableAttributedString(string: name)
        
        // 转name 为NSString 然后获取nsrange
        let range = (name as NSString).rangeOfString("来自")
        // 通过富文本更改指定位置的属性
        attr.addAttribute(NSForegroundColorAttributeName, value: UIColor.grayColor(), range: range)
        
        //  设置富文本指定位置的字体大小
        //attr.addAttribute(NSFontAttributeName, value: UIFont.systemFontOfSize(18), range: range)
        
        return attr
        
    }
    
    // MARK: - 处理首页图文混排问题
    func getWeiboAttr(text: String) -> NSMutableAttributedString{
        // 把微博的正文的字符串转成一个可变的富文本
        let allAttr = NSMutableAttributedString(string: text)
        
        // 定义一个数组保存遍历的对应模型
        var matchResult: [LPFMatchResult] = [LPFMatchResult]()
        
        //正则表达式的汉字匹配
        (text as NSString).enumerateStringsMatchedByRegex("\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (count, result, range, _) -> Void in
            // 定义一个模型 保存每次遍历的到的文字 和范围
            let match = LPFMatchResult(string: (result.memory as! String), range: range.memory)
            
            // 通过数据保存所有的遍历结果对象的模型
            matchResult.append(match)
        }
        
        // 由于越界问题 我们需要采用倒着遍历
        for match in matchResult.reverse(){
            // 判断我们的图片描述是否在我们本地的默认或者郎小花一维数组中
            let emoticon = LPFEmoticonTools.sharedTools.getEmoticonWithChs(match.string)
            // 判断是否存在
            guard let e = emoticon else{
                return NSMutableAttributedString(string: "")
            }
            
            let s1 = e.path ?? ""
            let s2 = e.png ?? ""
            let path = "\(s1)\(s2)"
            
            // 通过全路径得到image
            let image = UIImage(named: path, inBundle: LPFEmoticonTools.sharedTools.emoticonBundle, compatibleWithTraitCollection: nil)
            
            //得到行高
            let lineHeight = UIFont.systemFontOfSize(14).lineHeight
            // 创建已给文本附件
            let att = NSTextAttachment()
            att.image = image
            
            //设置bounds
            att.bounds = CGRect(x: 0, y: -4, width: lineHeight, height: lineHeight)
            // 初始化一个不可变的富文本
            let attr = NSAttributedString(attachment: att)
            //做替换
            allAttr.replaceCharactersInRange(match.range, withAttributedString: attr)
            
        }
        return allAttr
    }

}
